package com.article.servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.article.database.DBConnector;
import com.article.myownservlet.ArticleInfoIndex;
import com.article.servlet.page.PageableResultSet;
import com.article.servlet.page.PageableResultSetImpl;
import com.util.LogHelper;
/**
 * 查询数据库的Servlet
 */
public class QueryDBServlet extends HttpServlet {
    
    /**
     * 注释内容
     */
    private static final long serialVersionUID = 1509732944557272016L;
    // 数据库连接变量
    Connection con = null;
    Statement sm = null;
    /**
     * 初始化Servlet实例时调用该方法
     */
    public void init() throws ServletException {
        super.init();
        // 从web.xml中读取servlet的配置参数
        String dbURL = this.getServletConfig().getInitParameter("dbURL");
        String driver = this.getServletConfig().getInitParameter("driver");
        String username = this.getServletConfig().getInitParameter("username");
        String password = this.getServletConfig().getInitParameter("password");
        try {
            // 连接数据库
            con = DBConnector.getConnection(driver, dbURL, username, password);
            sm = con.createStatement();
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
    /**
     * 处理doGet请求，当JSP表单中的method为get时，会调用该方法
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        this.doPost(request, response);
    }
    /**
     * 处理doPost请求，当JSP表单中的method为post时，会调用该方法
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 从request中获取JSP页面上表单的输入参数
        String sql = request.getParameter("querySQL");
        int pageIndex = Integer.parseInt((String)request.getParameter("pageIndex"));
        int pageSize = Integer.parseInt((String)request.getParameter("pageSize"));
        String servleturl = request.getParameter("servleturl");
        String errorurl = request.getParameter("errorurl");
        try {
            // 判断SQL语句是否为查询语句，以放置修改数据库
            sql = sql.trim();
            LogHelper.getLogger().info("输入的查询语句为：" + sql);
            if (!sql.toUpperCase().startsWith("SELECT ")){
                throw new Exception("输入的SQL语句必须是查询语句！");
            }
            // 执行查询
            ResultSet rs = sm.executeQuery(sql);
            
            // 为了防止数据库连接被关闭时，ResultSet中的数据无法读取的问题
            // 在这里将ResultSet转换成CachedRowSet，它存在于内存中，不依赖于数据库。
//            CachedRowSet crs = new CachedRowSetImpl();
            // populate方法把ResultSet中的数据导入到CachedRowSet中
//            crs.populate(rs);
            
            // 构造能够分页的PageableResultSet对象
//            PageableResultSet pageResultSet = new PageableResultSetImpl(crs);
            PageableResultSet pageResultSet = new PageableResultSetImpl(rs);
            // 设置每页的记录数和当前页码
            pageResultSet.setPageSize(pageSize);
            pageResultSet.gotoPage(pageIndex);
            // 将结果放入session中
            HttpSession session = request.getSession();
            session.setAttribute("pageResultSet", pageResultSet);
            
            // 本Servlet处理完毕，将请求转发给下一页面。
            request.getRequestDispatcher(servleturl).forward(request, response);
        } catch (Exception e){
            // 查询错误时，清除Session的信息
            HttpSession session = request.getSession();
            session.removeAttribute("pageResultSet");
            // 出现异常时，记录异常信息
            request.setAttribute("errormsg", e.getMessage());
            // 将请求转发给错误页面
            request.getRequestDispatcher(errorurl).forward(request, response);
        }
    }
    /**
     * 销毁Servlet实例时，调用该方法
     */
    public void destroy() {
        super.destroy();
        try {
            // 关闭Statement
            if (sm != null){
                sm.close();
            }
        } catch (Exception e1){
        }
        try {
            // 关闭Connection
            if (con != null){
                con.close();
            }
        } catch (Exception e1){
        }
    }
    
    public String getServletInfo() {
        return "Query Database Servlet";
    }
    
    public static void main(String[] args) {
		System.out.println("111");
		// 测试
		    ArticleInfoIndex ci = new ArticleInfoIndex();
			try {
				long startTime = new Date().getTime();
				ci.writeIndex();
				long endTime = new Date().getTime();
				LogHelper.getLogger().info("\n这花费了" + (endTime - startTime) + " 毫秒增加到索引!");

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
}
